﻿//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Collections.Specialized;
//using System.IO;
//using System.Linq;
//using System.Net;
//using System.Reflection;
//using System.Text;
//using System.Threading;
//using System.Web;
//using System.Windows;
//using System.Windows.Controls;
//using System.Windows.Media;
//using System.Windows.Media.Media3D;

//namespace VideoMagic
//{
//    public class HttpCommandListener
//    {
//        public static void Start(KinectMapperBak window)
//        {
//            Thread listenerThread = new Thread(Starter);

//            listenerThread.Start(window);
//        }

//        static void Starter(object demoWindow)
//        {
//            if (demoWindow is KinectMapperBak)
//            {
//                MainLoop(demoWindow as KinectMapperBak);
//            }
//            else
//            {
//                throw new ArgumentException("object must be of type DepthFrameMap");
//            }
//        }

//        public static void MainLoop(KinectMapperBak demoWindow)
//        {
//            HttpListener listener = new HttpListener();
//            listener.Prefixes.Add("http://+:8192/");
//            // Use the following command to grant the right to open this connection
//            // or run as administrator
//            // netsh http add urlacl url=http://+:8192/ user=everyone
//            listener.Start();
//            Console.WriteLine("Listening...");

//            for (; ; )
//            {
//                HttpListenerContext ctx = listener.GetContext();
//                new Thread(new Worker(ctx, demoWindow).ProcessRequest).Start();
//            }
//        }


//        class Worker
//        {
//            public struct HttpCommand
//            {
//                public string Name { get; set; }
//                public string Command { get; set; }
//                public Action<KinectMapperBak> Action { get; set; }

//                static List<HttpCommand> _commandList;

//                public static List<HttpCommand> GetCommandList()
//                {
//                    if (_commandList == null)
//                    {
//                        _commandList = new List<HttpCommand>();
//                        _commandList.Add(new HttpCommand() { Name = "Fade", Command = "Fade", Action = v => v.StartFade() });
//                        _commandList.Add(new HttpCommand() { Name = "Capture", Command = "Capture", Action = v => v.CaptureBackground() });
//                        _commandList.Add(new HttpCommand() { Name = "Sink", Command = "Sink", Action = v => v.Sink() });
//                        _commandList.Add(new HttpCommand() { Name = "Levitate", Command = "Levitate", Action = v => v.Levitate() });
//                        _commandList.Add(new HttpCommand() { Name = "Only Player", Command = "OnlyPlayer", Action = v => v.ShowOnlyPlayer() });
//                        _commandList.Add(new HttpCommand() { Name = "Full Screen", Command = "Full", Action = v => v.FullScreen() });
//                        _commandList.Add(new HttpCommand() { Name = "Close", Command = "Close", Action = v => v.Close() });
//                    }

//                    return _commandList;
//                }
//            }

//            private HttpListenerContext context;
//            KinectMapperBak _demoWindow;

//            public Worker(HttpListenerContext context, KinectMapperBak demoWindow)
//            {
//                this.context = context;
//                _demoWindow = demoWindow;
//            }

//            public void ProcessRequest()
//            {
//                string command = context.Request.Url.PathAndQuery;
//                NameValueCollection parms;

//                if (command.Contains("?"))
//                {
//                    string[] cmdParts = command.Split(new char[] { '?' }, 2);
//                    command = cmdParts[0];
//                    parms = HttpUtility.ParseQueryString(cmdParts[1]);
//                }
//                else
//                {
//                    parms = new NameValueCollection();
//                }

//                command = command.Replace("/", "");

//                string msg = "Command: " + command;

//                var commandSearch = HttpCommand.GetCommandList().Where(v => v.Command.ToLower() == command.ToLower());

//                if (commandSearch.Count() == 0)
//                {
//                    if (!string.IsNullOrEmpty(command))
//                    {
//                        msg += " not found";
//                    }
//                }

//                StringBuilder sb = new StringBuilder();
//                sb.Append("<html><body><style>body,h1,a,input { font-size: 32px; }</style><h1>" + msg + "</h1>");

//                foreach (var httpCommand in HttpCommand.GetCommandList())
//                {
//                    sb.Append("<a href=\"/" + httpCommand.Command + "\">" + httpCommand.Name + "</a><br/>");
//                }

//                sb.Append("<form action=\"/Text\" method=\"get\"><input type=\"text\" name=\"text\"/><input type=\"submit\" /></form>");

//                //DumpRequest(context.Request, sb);

//                sb.Append("</body></html>");

//                byte[] b = Encoding.UTF8.GetBytes(sb.ToString());
//                context.Response.AddHeader("Cache-Control", "no-cache");
//                context.Response.AddHeader("Pragma", "no-cache");
//                context.Response.AddHeader("Expires", "-1");
//                context.Response.ContentLength64 = b.Length;

//                context.Response.OutputStream.Write(b, 0, b.Length);

//                context.Response.OutputStream.Close();

//                if (commandSearch.Count() > 0)
//                {
//                    commandSearch.First().Action(_demoWindow);
//                }

//            }

//            void DoCommand(Action command)
//            {
//                command();
//            }

//            private void DumpRequest(HttpListenerRequest request, StringBuilder sb)
//            {
//                DumpObject(request, sb);
//            }

//            private void DumpObject(object o, StringBuilder sb)
//            {
//                DumpObject(o, sb, true);
//            }

//            private void DumpObject(object o, StringBuilder sb, bool ulli)
//            {
//                if (ulli)
//                    sb.Append("<ul>");

//                if (o is string || o is int || o is long || o is double)
//                {
//                    if (ulli)
//                        sb.Append("<li>");

//                    sb.Append(o.ToString());

//                    if (ulli)
//                        sb.Append("</li>");
//                }
//                else
//                {
//                    Type t = o.GetType();

//                    foreach (PropertyInfo p in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
//                    {
//                        sb.Append("<li><b>" + p.Name + ":</b> ");

//                        object val = null;

//                        try
//                        {
//                            val = p.GetValue(o,
//                            null);
//                        }
//                        catch { }

//                        if (val is string || val is int || val is long || val is double)
//                            sb.Append(val);
//                        else
//                            if (val != null)
//                            {
//                                Array arr = val as Array;

//                                if (arr == null)
//                                {
//                                    NameValueCollection nv = val as NameValueCollection;

//                                    if (nv == null)
//                                    {
//                                        IEnumerable ie = val as IEnumerable;

//                                        if (ie == null)
//                                            sb.Append(val.ToString());
//                                        else
//                                            foreach (object oo in ie)
//                                                DumpObject(oo, sb);
//                                    }
//                                    else
//                                    {
//                                        sb.Append("<ul>");

//                                        foreach (string key in nv.AllKeys)
//                                        {
//                                            sb.AppendFormat("<li>{0} = ", key);

//                                            DumpObject(nv[key], sb, false);

//                                            sb.Append("</li>");
//                                        }

//                                        sb.Append("</ul>");
//                                    }
//                                }
//                                else
//                                    foreach (object oo in arr)
//                                        DumpObject(oo, sb);
//                            }
//                            else
//                            {
//                                sb.Append("<i>null</i>");
//                            }
//                        sb.Append("</li>");
//                    }
//                }

//                if (ulli)
//                    sb.Append("</ul>");

//            }
//        }
//    }
//}